package com.example.movie.mate.service.impl;

import com.example.movie.mate.dao.mapper.UserMapper;
import com.example.movie.mate.exception.ServiceException;
import com.example.movie.mate.pojo.core.Principle;
import com.example.movie.mate.pojo.entity.User;
import com.example.movie.mate.pojo.param.UserLoginParam;
import com.example.movie.mate.pojo.param.UserRegisterParam;
import com.example.movie.mate.pojo.vo.UserLoginResultVO;
import com.example.movie.mate.pojo.vo.UserVO;
import com.example.movie.mate.service.IUserService;
import com.example.movie.mate.web.StateCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public Principle login(UserLoginParam param) {
        // 根据用户名查询用户信息
        UserLoginResultVO findResult = userMapper.selectByUsername(param.getUsername());

        // 如果用户信息为空，则抛出用户名不存在的异常
        if (findResult == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "用户名不存在");
        }

        // 如果用户密码与输入密码不匹配，则抛出密码错误的异常
        if (!findResult.getPassword().equals(param.getPassword())) {
            throw new ServiceException(StateCode.ERROR_UNAUTHORIZED, "密码错误");
        }

        // 创建一个新的Principle对象来存储用户信息
        Principle result = new Principle();
        // 将查询到的用户信息复制到Principle对象中
        BeanUtils.copyProperties(findResult, result);

        // 返回填充了用户信息的Principle对象
        return result;
    }

    @Override
    public void register(UserRegisterParam userRegisterParam) {
        // 检查用户名是否已存在
        int countByUsername = userMapper.countByUsername(userRegisterParam.getUsername());
        if (countByUsername > 0) {
            // 如果用户名已存在，抛出服务异常
            throw new ServiceException(StateCode.ERROR_CONFLICT, "用户名已存在");
        }

        // 创建新用户对象
        User user = new User();
        // 将用户注册参数复制到用户对象
        BeanUtils.copyProperties(userRegisterParam, user);
        // 设置用户非管理员
        user.setIsAdmin(0);

        // 插入用户到数据库
        userMapper.insert(user);
    }

    @Override
    public void deleteById(Long id) {
        // 根据用户ID查询用户信息
        UserVO findResult = userMapper.selectById(id);
        // 如果用户不存在，则抛出服务异常
        if (findResult == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "用户不存在");
        }

        // 删除用户信息
        userMapper.deleteById(id);
    }

    @Override
    public UserVO selectById(Long id) {
        UserVO findResult = userMapper.selectById(id);
        if (findResult == null) {
            throw new ServiceException(StateCode.ERROR_NOT_FOUND, "用户不存在");
        }
        log.debug("查询用户信息成功：{}", findResult);
        return userMapper.selectById(id);
    }

    @Override
    public List<UserVO> selectAll() {
        return userMapper.selectAll();
    }

}